package rawwrs.dao.jpa;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;

import rawwrs.bean.PropiedadDTO;
import rawwrs.bean.PropiedadDetalleDTO;
import rawwrs.bean.UsuarioDTO;
import rawwrs.entity.Propiedad;
import rawwrs.entity.PropiedadDetalle;
import rawwrs.entity.Usuario;
import rawwrs.util.JPAUtilSingleton;

public class PropiedadDetalleJPADAO {

	
	@SuppressWarnings("unchecked")
	public List<PropiedadDetalleDTO> obtener_x_propiedad(int codigo_propiedad) throws Exception {
		
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();
		
		List<PropiedadDetalleDTO> propiedades = new ArrayList<PropiedadDetalleDTO>();
		 
		javax.persistence.Query query = em.createQuery("SELECT c FROM PropiedadDetalle c");
	
		List<PropiedadDetalle> l = query.getResultList();	
		
		for ( int i=0; i < l.size(); i++ ) {
			
			PropiedadDetalle entidadPropiedadDet = (PropiedadDetalle)l.get(i);
			
			if(entidadPropiedadDet.getPropiedad_id().getId()==codigo_propiedad){
				PropiedadDetalleDTO dto = new PropiedadDetalleDTO(null, entidadPropiedadDet.getId(), entidadPropiedadDet.getFoto());
				propiedades.add( dto );
			}
		}

		em.close();

		return propiedades;
	}
	
	
	@SuppressWarnings("unchecked")
	public List<PropiedadDetalleDTO> obtenerTodos() throws Exception {
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();
		
		List<PropiedadDetalleDTO> propiedades = new ArrayList<PropiedadDetalleDTO>();
		 
		List l =  em.createQuery( "SELECT c FROM PropiedadDetalle c ORDER BY c.id" ).getResultList();
		
		for ( int i=0; i < l.size(); i++ ) {
			PropiedadDetalle entidadPropiedadDet = (PropiedadDetalle)l.get(i);
			
			Propiedad entidadPropiedad = entidadPropiedadDet.getPropiedad_id();
			
			Usuario entidadUsuario=entidadPropiedad.getUsuario_id();
			
			UsuarioDTO usuarioDTO=new UsuarioDTO(new Integer(entidadUsuario.getId()) , entidadUsuario.getIdusuario(), 
			entidadUsuario.getPerfil(), entidadUsuario.getNombres(), entidadUsuario.getApellidos(), 
			entidadUsuario.getTelefono_casa(), entidadUsuario.getTelefono_celular(), entidadUsuario.getDireccion(),
			entidadUsuario.getEmail(), entidadUsuario.getPassword(), entidadUsuario.getToken(), entidadUsuario.getEstado_usuario(),
			entidadUsuario.getEstado_admin(), entidadUsuario.getTipo_usuario());
			
			PropiedadDTO propiedadDTO = new PropiedadDTO(entidadPropiedad.getId(),entidadPropiedad.getIdpropiedad(), entidadPropiedad.getTitulo(), entidadPropiedad.getDescripcion(),
					entidadPropiedad.getDepartamento(), entidadPropiedad.getProvincia(),entidadPropiedad.getDistrito(),
					entidadPropiedad.getTipo_propiedad(), entidadPropiedad.getModalidad(), entidadPropiedad.getPrecio(),
					entidadPropiedad.getDireccion(), entidadPropiedad.getArea_construida(), entidadPropiedad.getArea_terminada(),
					entidadPropiedad.getUbicacion_referencial(), entidadPropiedad.getPiscina(), entidadPropiedad.getEstacionamiento(),
					entidadPropiedad.getSauna(), entidadPropiedad.getEstudio(), entidadPropiedad.getJardin(), entidadPropiedad.getLiving(),
					entidadPropiedad.getAno_construccion(), entidadPropiedad.getNum_banos(), entidadPropiedad.getNum_habitaciones(),entidadPropiedad.getLongitud(),
					entidadPropiedad.getLatitud(), entidadPropiedad.getEstado_destacado(), entidadPropiedad.getEstado_proyecto(), entidadPropiedad.getEstado_usuario(),
					entidadPropiedad.getEstado_admin(), entidadPropiedad.getEstado_direccion(), entidadPropiedad.getIdusuario(), entidadPropiedad.getCreate_at(), entidadPropiedad.getUpdate_at(), usuarioDTO);
			
			PropiedadDetalleDTO dto = new PropiedadDetalleDTO(propiedadDTO, entidadPropiedadDet.getId(), entidadPropiedadDet.getFoto());

			propiedades.add( dto );
		}

		em.close();

		return propiedades;
	}
	
	

	public void insertar(PropiedadDetalleDTO propiedaddetDTO,String Ruta) throws Exception {
		
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();
		
	
			System.out.println("llego a propiedad detalle:-ruta: "+Ruta);
			em.getTransaction().begin();			
			Propiedad entidadPropiedad = new Propiedad();
			entidadPropiedad.setId(propiedaddetDTO.getPropiedad().getId()); 			
			PropiedadDetalle entidadPropiedadDet =new PropiedadDetalle();
			entidadPropiedadDet.setId(propiedaddetDTO.getId());
			entidadPropiedadDet.setPropiedad_id(entidadPropiedad);
			entidadPropiedadDet.setFoto(propiedaddetDTO.getRuta());			
			em.persist(entidadPropiedadDet);
			em.flush();			
			em.getTransaction().commit();
			em.close();
			guardaImagen(propiedaddetDTO.getPropiedad().getId()+"-"+propiedaddetDTO.getRuta(),propiedaddetDTO.getArchivo(),Ruta);
	}

	public void actualizar(PropiedadDetalleDTO propiedaddet,String Ruta) throws Exception {
	
	    System.out.println("id: "+propiedaddet.getPropiedad().getId()+"ruta: "+Ruta);
		guardaImagen(propiedaddet.getPropiedad().getId()+"-"+propiedaddet.getRuta(),propiedaddet.getArchivo(),Ruta);
	}

	public void eliminar(PropiedadDTO propiedaddetDTO) throws Exception {
		
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();

		em.getTransaction().begin();

		List<PropiedadDetalleDTO> l = obtenerTodos();
		
		for (int i = 0; i < l.size(); i++) {
			if(l.get(i).getPropiedad().getId()==propiedaddetDTO.getId()){
				
			PropiedadDetalle entidadPropiedad=(PropiedadDetalle)em.find(PropiedadDetalle.class,l.get(i).getId());

			em.remove(entidadPropiedad);
			em.flush();
			}
		}
		
		em.getTransaction().commit();
		
		em.close();
		
		System.out.println("Se eliminaron los registros de esa propiedad");
	}

	public PropiedadDetalleDTO obtenerDetallePropiedad(PropiedadDetalleDTO propiedaddetDTO)
			throws Exception {
		EntityManager em = JPAUtilSingleton.
		getInstance().getEmf().createEntityManager();
		
		PropiedadDetalle entidadPropiedadDet =(PropiedadDetalle)em.find(PropiedadDetalle.class,propiedaddetDTO.getId());
		
		Propiedad entidadPropiedad = entidadPropiedadDet.getPropiedad_id();
		
		Usuario entidadUsuario=entidadPropiedad.getUsuario_id();
		UsuarioDTO usuarioDTO=new UsuarioDTO(new Integer(entidadUsuario.getId()) , entidadUsuario.getIdusuario(), 
		entidadUsuario.getPerfil(), entidadUsuario.getNombres(), entidadUsuario.getApellidos(), 
		entidadUsuario.getTelefono_casa(), entidadUsuario.getTelefono_celular(), entidadUsuario.getDireccion(),
		entidadUsuario.getEmail(), entidadUsuario.getPassword(), entidadUsuario.getToken(), entidadUsuario.getEstado_usuario(),
		entidadUsuario.getEstado_admin(), entidadUsuario.getTipo_usuario());
		
		PropiedadDTO propiedadDTO = new PropiedadDTO(entidadPropiedad.getId(),entidadPropiedad.getIdpropiedad(), entidadPropiedad.getTitulo(), entidadPropiedad.getDescripcion(),
				entidadPropiedad.getDepartamento(), entidadPropiedad.getProvincia(),entidadPropiedad.getDistrito(),
				entidadPropiedad.getTipo_propiedad(), entidadPropiedad.getModalidad(), entidadPropiedad.getPrecio(),
				entidadPropiedad.getDireccion(), entidadPropiedad.getArea_construida(), entidadPropiedad.getArea_terminada(),
				entidadPropiedad.getUbicacion_referencial(), entidadPropiedad.getPiscina(), entidadPropiedad.getEstacionamiento(),
				entidadPropiedad.getSauna(), entidadPropiedad.getEstudio(), entidadPropiedad.getJardin(), entidadPropiedad.getLiving(),
				entidadPropiedad.getAno_construccion(), entidadPropiedad.getNum_banos(), entidadPropiedad.getNum_habitaciones(),entidadPropiedad.getLongitud(),
				entidadPropiedad.getLatitud(), entidadPropiedad.getEstado_destacado(), entidadPropiedad.getEstado_proyecto(), entidadPropiedad.getEstado_usuario(),
				entidadPropiedad.getEstado_admin(), entidadPropiedad.getEstado_direccion(), entidadPropiedad.getIdusuario(), entidadPropiedad.getCreate_at(), entidadPropiedad.getUpdate_at(), usuarioDTO);
		
		PropiedadDetalleDTO dto = new PropiedadDetalleDTO(propiedadDTO, entidadPropiedadDet.getId(), entidadPropiedadDet.getFoto());
			System.out.println("Foto-> " + dto.getFoto());
		em.close();
		
		return dto;
	}

	

	public String guardaImagen(String nombreArchivo, File archivo,String ruta)
			throws IOException {
		
			  String rutaArchivos =ruta;		
			  FileInputStream in = null;
		      FileOutputStream out = null;	

		      System.out.println("Ruta donde se guardan: "+ruta);
		   
		      String directoryName = rutaArchivos;
		      File dir = new File ( directoryName);
		      
		      if (!dir.exists())
		           dir.mkdir();
		      
		      String targetPath =  dir.getPath() + File.separator + nombreArchivo;		        
		      File picDestination = new File ( targetPath);		      
		      try {
		            
		    	  	in = new FileInputStream(archivo);
		            out = new FileOutputStream( picDestination );
		            int c;

		            while ((c = in.read()) != -1) {
		                out.write(c);
		            }

		        }finally {
		            if (in != null) {
		                in.close();
		            }
		            if (out != null) {
		                out.close();
		            }
		        }
		
		
		return null;
	}
	
	

}
